package com.hzw.saas.api.old.storage;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import com.hzw.saas.api.old.storage.bo.ResourceFileBO;
import com.hzw.saas.api.old.storage.enums.ConflictModeEnum;
import org.springframework.web.multipart.MultipartFile;

/**
 * <p>
 * 资源表 服务类
 * </p>
 *
 * @author zzl
 * @since 2020-12-24
 */
public interface IResourceFileService {

    /**
     * 根据ID获取资源信息
     *
     * @param fileId        资源ID
     * @param throwNotFound 不存在时是否抛出异常
     * @return 资源信息
     */
    ResourceFileBO getFileInfo(String fileId, boolean throwNotFound);

    /**
     * 获取文件信息
     *
     * @param fileId        文件ID
     * @param status        文件状态
     * @param integrity     文件完整性状态
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return 文件信息
     */
    ResourceFileBO getFileInfo(String fileId, Integer status, Integer integrity, boolean throwNotFound);

    /**
     * 获取根目录下指定名称的文件
     * 只获取正常状态的文件
     *
     * @param ownerId
     * @param catalog
     * @param name
     * @param throwNotFound
     * @return
     */
    ResourceFileBO getFileInfoByNameInRoot(String ownerId, String catalog, String name, boolean throwNotFound);

    /**
     * 获取父目录下指定名称的文件
     * 只获取正常状态的文件
     *
     * @param parentId
     * @param name
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return
     */
    ResourceFileBO getFileInfoByName(String parentId, String name, boolean throwNotFound);

    /**
     * 获取用户指定状态的所有文件的数量
     *
     * @param ownerId   文件所有者ID
     * @param catalog   存储桶
     * @param status    文件状态，可选
     * @param integrity 文件完整性状态，可选
     * @return 文件信息列表
     */
    int totalCount(String ownerId, String catalog, Integer status, Integer integrity);

    /**
     * 统计用户所有文件大小
     *
     * @param ownerId
     * @param status
     * @return
     */
    long totalSize(String ownerId, String catalog, Integer status, Integer integrity);

    long countFilesSize(List<String> fileIds);

    /**
     * 获取指定Id的文件列表
     *
     * @param fileIds
     * @param status
     * @param integrity
     * @return
     */
    List<ResourceFileBO> listFileInfo(List<String> fileIds, Integer status, Integer integrity, boolean throwNotFound);

    /**
     * 获取用户指定状态的所有文件
     *
     * @param ownerId   文件所有者ID
     * @param catalog   存储桶
     * @param status    文件状态，可选
     * @param integrity 文件完整性状态，可选
     * @return 文件信息列表
     */
    List<ResourceFileBO> listFileInfo(String ownerId, String catalog, Integer status, Integer integrity);

    /**
     * 获取根目录下的所有文件
     *
     * @param ownerId   文件所有者ID
     * @param catalog   存储桶
     * @param status    文件状态，可选
     * @param integrity 文件完整性状态，可选
     * @return 文件信息列表
     */
    List<ResourceFileBO> listFileInfoInRoot(String ownerId, String catalog, Integer status, Integer integrity);

    /**
     * 获取目录下的文件列表
     *
     * @param folderId 目录ID，非根目录
     * @param status   文件状态，为空则不过滤
     * @return 文件信息列表
     */
    List<ResourceFileBO> listFileInfoInFolder(String folderId, Integer status, Integer integrity);

    /**
     * 检查资是否属于用户
     *
     * @param ownerId 用户ID
     * @param fileId  资源ID
     * @return 结果 true/false
     */
    boolean checkAuthOwn(String ownerId, String fileId);

    /**
     * 新建文件信息
     *
     * @param fileBo             文件信息
     * @param conflictHandleEnum
     * @return 文件信息，含生成的文件ID
     */
    ResourceFileBO saveFileInfo(ResourceFileBO fileBo, ConflictModeEnum conflictHandleEnum);

    ResourceFileBO saveFile(ResourceFileBO fileBO, InputStream inputStream, ConflictModeEnum conflictHandleEnum);

    ResourceFileBO saveFile(ResourceFileBO fileBO, MultipartFile file, ConflictModeEnum conflictHandleEnum);

    /**
     * 复制文件信息
     *
     * @param fileIds
     * @param targetFolderId
     * @param conflictHandleEnum
     */
    void copyFilesInfo(List<String> fileIds, String targetFolderId, ConflictModeEnum conflictHandleEnum);

    /**
     * 移动文件信息
     *
     * @param fileIds
     * @param targetFolderId
     * @param conflictHandleEnum
     */
    void moveFilesInfo(List<String> fileIds, String targetFolderId, ConflictModeEnum conflictHandleEnum);

    /**
     * 更新文件信息
     *
     * @param fileBO 文件信息
     */
    void updateFileInfo(ResourceFileBO fileBO, ConflictModeEnum conflictHandleEnum, boolean throwDeleted);

    /**
     * 更新文件完整性状态
     *
     * @param fileId    文件ID
     * @param integrity 文件完整性状态
     * @return 更新后的文件信息
     */
    void updateFileIntegrity(String fileId, Integer integrity);

    /**
     * 更新文件状态
     *
     * @param fileId 文件ID
     * @param status 文件状态
     * @return 更新后的文件信息
     */
    void updateFilesStatus(String fileId, Integer status, boolean throwDeleted);

    /**
     * 批量更新文件状态
     *
     * @param fileIdList 待更新文件ID
     * @param status     文件状态
     */
    void updateFilesStatus(List<String> fileIdList, Integer status, boolean throwDeleted);

    /**
     * 更新根目录下所有的文件状态
     *
     * @param ownerId 所有者ID
     * @param catalog 存储桶
     * @param status  文件状态
     */
    void updateFilesStatusInRoot(String ownerId, String catalog, Integer status);

    /**
     * 更新目录中所有文件状态
     *
     * @param folderId 目录ID，非根目录
     * @param status   文件状态
     */
    void updateFilesStatusInFolder(String folderId, Integer status);

    /**
     * 删除文件
     *
     * @param fileId
     */
    void deleteFile(String fileId);

    /**
     * 上传文件至第三方存储
     *
     * @param fileId
     */
    void uploadFile(String fileId);

    /**
     * 下载文件
     *
     * @param fileId       文件ID
     * @param outputStream 文件流
     * @param startBytes   起始字节，如501，即为从501字节处开始下载
     */
    void downloadFile(String catalog, String fileId, OutputStream outputStream, long startBytes);

    /**
     * 获取文件存储对象
     *
     * @param fileId 文件ID
     * @return 文件存储对象
     */
    File getFile(String fileId);


}
